package Gramatica;


//* Anderson Caco : de <programa> até <decls_final>
//* André (Dedé): de <typedef> até <funcao>
//* Carlos: de <chamada_funcao> até <tipo_primitivo>
//* Edney: de <struct> até <cmd>
//* Elisson: de <if> até <for>
//* Ivo:  de <printf> até <atribuicao>
//* Linton: de <incremento> até <igualdade>
//* Marcone:  de <relacional> até <op_adicao>
//* Matheus: de <multiplicacaot> até <unario_prefixa>
//* Nathalia: de <unario_posfixa> até <primarios>


/*------------------------------------------------------------------------------
Regras
------------------------------------------------------------------------------
<x>     -   nao terminais
 x      -   reservadas
"x"     -   terminais
|       -   opcao
::=     -   operador
(x|x|x) -   escolha multipla
[x]     -   opcional com repeticao zero ou uma vez
{x}     -   opcional com repeticao zero ou mais vezes
{x}+    -   com repeticao uma ou mais vezes
-------------------------------------------------------------------------------
                                GRAMATICA
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Blocos
-------------------------------------------------------------------------------
<programa> ::= <diretivas> <decls_inicial> void main "(" ")" <corpo_funcao> - Semantico ok
<diretivas> ::= {include "<" identificador "." identificador ">"} - Semantico ok
<decls_inicial> ::= {<typedef> | <const> | <funcao> | <declaracao>} - Semantico ok
<corpo_funcao> ::= "{" {<instrucao>} "}" - Semantico ok
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Declaracoes iniciais
<typedef> ::= typedef (<tipo_primitivo> | <struct>) identificador ";"  - Semantico ok
<const> ::= const <tipo_primitivo> identificador "=" <expressao> ";"  - Semantico ok
<prototipo> ::= <tipo> identificador "(" [<args_declaracao>] ")" - Semantico ok
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Funcao
-------------------------------------------------------------------------------
<funcao> ::= <prototipo> <corpo_funcao>  - Semantico ok
<chamada_funcao> := identificador "(" [<args_chamada>] ")" - Semantico ok
<args_chamada> ::= <expressao> {, <expressao>}  - Semantico ok
<args_declaracao> ::= (<tipo_primitivo> | identificador) ["*"] identificador {"," (<tipo_primitivo> | identificador) ["*"] identificador } - Semantico ok
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Tipos
-------------------------------------------------------------------------------
<tipo> ::= <tipo_primitivo> |  void - Semantico ok
<tipo_primitivo> ::= char | int | float | boolean - Semantico ok
<struct> ::= struct "{" {<declaracao>}+ "}" - Semantico ok
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Declaracoes
-------------------------------------------------------------------------------
<declaracao> ::= (<tipo_primitivo> | identificador) ["*"] identificador <array> {"," ["*"] identificador <array> } ";" - Semantico ok
<array> ::= {"[" numeroInteiro "]"} - Semantico ok
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Comandos
-------------------------------------------------------------------------------
<cmd> ::= <if> | <while> | <do_while> | <return> | <for> | <printf> | <scanf> - Semantico ok
<if> := if "("<expressao>")" <bloco> [else <bloco>] - Semantico ok
<while> ::= while "(" <expressao> ")" <bloco> - Semantico ok
<do_while> ::= do <bloco> while "("<expressao> ")" ";"  - Semantico ok
<return> ::= return <expressao>; - Semantico ok
<for> ::= for "(" <atribuicao> ";" <expressao> ";" <incremento> ")" <bloco> - Semantico ok
<printf> ::= printf "(" charconst ["," <expressao>] ")" ";" - Semantico ok
<scanf> ::= scanf "(" identificador ")" ";" - Semantico ok
<bloco> ::= <instrucao> | "{" {<instrucao>} "}" - Semantico ok
<instrucao> ::= <declaracao>|<cmd>|<atribuicao>";"|<incremento>";"|<chamada_funcao>";" - Semantico ok
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Expressoes
-------------------------------------------------------------------------------
<atribuicao> ::= <elemento_var> "=" <expressao> - Semantico ok
<incremento> ::= identificador <op_incremento>  - Semantico ok

<expressao>  ::= <logica_e> {|| <logica_e>}  - Semantico ok
<logica_e> ::= <igualdade> {&& <igualdade>}  - Semantico ok
<igualdade> ::= <relacional> {<op_igualdade> <relacional>}  - Semantico ok
<relacional> ::= <exp_aritmetica> {<op_relacional> <exp_aritmetica>} - Semantico ok
<op_igualdade> ::= "==" | "!=" - Semantico ok
<op_relacional> ::= "<" | "<=" | ">" | ">=" - Semantico ok

<exp_aritmetica> ::= <multiplicacao> {<op_adicao> <multiplicacao>} - Semantico ok
<op_adicao> ::= "+" | "-" - Semantico ok
<multiplicacao> ::= <cast> {<op_multiplicacao> <cast>} - Semantico ok
<op_multiplicacao> ::= "*" | "/" - Semantico ok
<cast> ::= <unario_prefixa> | "(" <tipo_primitivo> ")" <cast> Semantico ok
<op_incremento> ::= "++" | "--" - Semantico ok
<unario_prefixa> ::= <unario_posfixa> | ("&" | "*") identificador  - Semantico ok
<unario_posfixa> ::= <elemento> |  identificador  - Semantico ok
<elemento> :=  <primario> | "(" <expressao> ")" - Semantico ok
<elemento_var> ::= identificador - Semantico ok
<primario> ::= numeroInteiro | numeroFlutuante | charconst - Semantico ok
------------------------------------------------------------------------------
 */
